//ZipStrUtil.java 
 package com.attilax.util;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import com.attilax.io.filex;
 
 /**
  * 
  *Module:          ZipUtil.java
  *Description:    对字符串的压缩及解压
  *Company:       
  *Author:           pantp
  *Date:             May 6, 2012
  */
 public class ZipStrUtil {
 
     public static void main(String[] args) throws IOException {
         // 字符串超过一定的长度
         String str = "ABCdef123中文~!@#$%^&*()_+{};/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLL" +
                 "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiii";
  //   str=filex.read("c:\\json2.txt");
         
         System.out.println("\n原始的字符串为------->" + str);
         float len0=str.length();
         System.out.println("原始的字符串长度为------->"+len0);
 
         String ys = compress(str);
         System.out.println("\n压缩后的字符串为----->" + ys);
         float len1=ys.length();
         System.out.println("压缩后的字符串长度为----->" + len1);
 
         String jy = unCompress(ys);
         System.out.println("\n解压缩后的字符串为--->" + jy);
         System.out.println("解压缩后的字符串长度为--->"+jy.length());
         
         System.out.println("\n压缩比例为"+len1/len0);
         
         //判断
         if(str.equals(jy)){
             System.out.println("先压缩再解压以后字符串和原来的是一模一样的");
         }else
        	 System.out.println("---not same");
     }
 
     /**
      * 字符串的压缩
      * 
      * @param str
      *            待压缩的字符串
      * @return    返回压缩后的字符串
      * @throws IOException
      */
     public static String compress_ns(String str) throws IOException {
         if (null == str || str.length() <= 0) {
             return str;
         }
         // 创建一个新的 byte 数组输出流
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         // 使用默认缓冲区大小创建新的输出流
         GZIPOutputStream gzip = new GZIPOutputStream(out);
         // 将 b.length 个字节写入此输出流
         gzip.write(str.getBytes("utf-8"));
         gzip.close();
         // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
         return out.toString("ISO-8859-1");
     }
     
     public static String compress(String str)   {
         if (null == str || str.length() <= 0) {
             return str;
         }
         // 创建一个新的 byte 数组输出流
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         // 使用默认缓冲区大小创建新的输出流
         GZIPOutputStream gzip;
		try {
			gzip = new GZIPOutputStream(out);
		
         // 将 b.length 个字节写入此输出流
         gzip.write(str.getBytes("utf-8"));
         gzip.close();
         // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
         return out.toString("ISO-8859-1");
		} catch (IOException e) {
			//  attilax 老哇的爪子 j_w_40   o86   
			e.printStackTrace();
			return str;
		}
     }
     
     /**
      * 字符串的解压
      * 
      * @param str
      *            对字符串解压
      * @return    返回解压缩后的字符串
      * @throws IOException
      */
     public static String unCompress(String str) throws IOException {
         if (null == str || str.length() <= 0) {
             return str;
         }
         // 创建一个新的 byte 数组输出流
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         // 创建一个 ByteArrayInputStream，使用 buf 作为其缓冲区数组
         ByteArrayInputStream in = new ByteArrayInputStream(str
                 .getBytes("ISO-8859-1"));
         // 使用默认缓冲区大小创建新的输入流
         GZIPInputStream gzip = new GZIPInputStream(in);
         byte[] buffer = new byte[256];
         int n = 0;
         while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组
             // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
             out.write(buffer, 0, n);
         }
         // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
         return out.toString("utf-8");
     }
 
 }